/**
 * Test de una aplicacion cliente de metainformacion
 * y emisora de eventos
 *
 * @date 15/10/2008
 * @author Carlos Rodriguez Dominguez
 */

#include <iostream>
#include <cstdlib>

#include "coordinationMiddleware.h"

//test de un objeto que soporta eventos
class test_object : public ListeningObject {
private:
	int x;
	int y;
	
public:
	test_object() : ListeningObject()
	{
		x = 0;
		y = 0;
	}
	
	void changeXY(int xx, int yy)
	{
		x = xx;
		y = yy;
		
		PairEvent ev(Collaboration::EVENT_HANDLER->getCommunicator());
		ev.setX(xx);
		ev.setY(yy);
		
		Collaboration::EVENT_HANDLER->push(ev);
	}
};

//test de una clase listener
class test_listener : public EventListener {
public:
	test_listener()
	{
		
	}
	
	~test_listener()
	{
		
	}
	
	bool checkEvent(Event& evt)
	{
		if (evt.getType() == PAIR_EVENT_TYPE)
		{
			return true;
		}
		else return false;
	}
	
	void action(void* receiver, Event& data)
	{
		PairEvent* ev = (PairEvent*)&data;
		
		printf("recibido: %d, %d \n", (int)ev->getX(), (int)ev->getY());
	}
	
	::std::string name()
	{
		return "test_listener";
	}
};

int main(int argc, char** argv)
{	
	if (!Collaboration::initCoordinationMiddleware())
	{
		std::cout << "error al inicializar el middleware de coordinacion\n";
		exit(1);
	}

	//////////  TEST DE OBJETO EMISOR/RECEPTOR DE EVENTOS //////////
	test_object dobj;
	test_listener listener;
	dobj.addEventListener(listener);
	
	Collaboration::EVENT_HANDLER->registerObject(dobj);
	
	std::cout << "\n\nPrueba de componente distribuido: \n";
	int x,y;
	while(1){
		std::cout << "introduzca numero para enviar evento: ";
		scanf("%d %d", &x, &y);
		
		dobj.changeXY(x, y);
		
	} //bucle infinito para evitar el fin del cliente
	
	Collaboration::shutdownCoordinationMiddleware();
	
	return 0;
}
